package cn.tedu.v3_1;

import java.io.*;
import java.net.*;
import java.util.*;




public class Server {
    private ServerSocket serverSocket;
    //优化1.端口号提前声明：私有属性
    private static final Integer PORT=1357;
    public Server(){
        try {
            serverSocket=new ServerSocket(PORT);
        } catch (BindException e){
            System.out.println("请检查端口号，被占用");
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void start(){
        try {
            while(true) {
                System.out.println("等待客户端链接");
                Socket socket = serverSocket.accept();
                new Thread(new ClientHandler(socket)).start();
            }
        } catch (IOException e) {
            System.out.println("客户端链接失效了");
        } finally {
            if(serverSocket!=null&&!serverSocket.isClosed()){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    System.out.println("服务器关闭失败~~~");
                }
                System.out.println("服务器关闭成功~~Over");
            }
        }
    }

    public static void main(String[] args){
        new Server().start();
    }
     //ClientHandler多线程类：控制客户端发来的通讯信息
    private class ClientHandler implements Runnable{
        private Socket socket;
        private String ip;

         private  PrintWriter pw;
         private  BufferedReader br;

        public ClientHandler(Socket s){
            //1.明确接入客户端  通讯类  Socket
            this.socket=s;
            //2.明确接入客户端，IP地址
            ip=socket.getInetAddress().getHostAddress();
            //3.给明确接入客户端，读写功能
            try {
                br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF8"));
                pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF8")),true);
            } catch (IOException e) {
                System.out.println("客户端断开链接了~");
            }


        }

        public void run() {
            try {
                new Thread (()->{
                        try {
                            String message;
                            while ((message= br.readLine())!=null) {   //读入客户端
                                System.out.println(ip+"客户端说：" + message);

                                System.out.println("服务器请输入：");
                                    }
                        } catch (IOException e) {
                            System.out.println("客户端发来的消息断开了~");
                        }
                    }).start();
            //1.5增加写出操作【修改目的：读入写出通顺】
            //1.5.1   控制台卡住---输入内容
            Scanner input=new Scanner(System.in);
            //1.5.2一直写出
             while(true){
                 System.out.println("服务器请输入：");
                 String sme=input.nextLine();
                 pw.println("服务器说："+sme);
             }
            } finally {
                if(pw!=null)
                    pw.close();
                if (br!= null)
                    try {
                        br.close();
                    } catch (IOException e) {
                        System.out.println("读入流断开链接~");
                    }

                if(socket!=null&&!socket.isClosed()){
                    System.out.println(ip+"客户端退出服务器链接~");
                    try {
                        socket.close();
                    } catch (IOException e) {
                        System.out.println(ip+"客户端退出连接异常~");
                    }
                }
              }
            }
        }
  }
